bitkeeper revision 1.1159.102.1 (4163f3e1F0LimXbocHs-QcPviz39JA)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Wed, 6 Oct 2004 13:32:17 +0000 (13:32 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Wed, 6 Oct 2004 13:32:17 +0000 (13:32 +0000)
Improve error messages by unwrapping Failures.

tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/server/SrvDomainDir.py

index 8a8af83c10ebe13430d9da6b1d5370113f3a10b5..470ae7250e1aeb828daeee594973f3f40cd70590 100644 (file)
@@ -347,6 +347,18 @@ def append_deferred(dlist, v):
     if isinstance(v, defer.Deferred):
         dlist.append(v)
 
+def dlist_err(val):
+    """Error callback suitable for a deferred list.
+    In a deferred list the error callback is called with with Failure((error, index)).
+    This callback extracts the error and returns it.
+
+    @param val: Failure containing (error, index)
+    @type val: twisted.internet.failure.Failure 
+    """
+    
+    (error, index) = val.value
+    return error
+
 class XendDomainInfo:
     """Virtual machine object."""
 
@@ -819,6 +831,7 @@ class XendDomainInfo:
             append_deferred(dlist, v)
             index[dev_name] = dev_index + 1
         deferred = defer.DeferredList(dlist, fireOnOneErrback=1)
+        deferred.addErrback(dlist_err)
         return deferred
 
     def device_create(self, dev_config):
@@ -1050,6 +1063,7 @@ class XendDomainInfo:
                 log.warning("Unknown config field %s", field_name)
             index[field_name] = field_index + 1
         d = defer.DeferredList(dlist, fireOnOneErrback=1)
+        deferred.addErrback(dlist_err)
         return d
 
 
index 6307b25089d731991024be12b11a22c02ad513f7..4526b996f9ea46e15ba3152f1b59dca83399b806 100644 (file)
@@ -5,6 +5,7 @@ from StringIO import StringIO
 
 from twisted.protocols import http
 from twisted.web import error
+from twisted.python.failure import Failure
 
 from xen.xend import sxp
 from xen.xend import XendDomain
@@ -94,6 +95,8 @@ class SrvDomainDir(SrvDir):
     def _op_create_err(self, err, req):
         """Callback to handle errors in deferred domain creation.
         """
+        if isinstance(err, Failure):
+            err = err.getErrorMessage()
         print 'op_create> Deferred Exception creating domain:', err
         req.setResponseCode(http.BAD_REQUEST, "Error creating domain: " + str(err))
         return str(err)
@@ -127,6 +130,8 @@ class SrvDomainDir(SrvDir):
             return val
 
     def _op_restore_err(self, err, req):
+        if isinstance(err, Failure):
+            err = err.getErrorMessage()
         print 'op_create> Deferred Exception restoring domain:', err
         req.setResponseCode(http.BAD_REQUEST, "Error restoring domain: "+ str(err))
         return str(err)